//路径总和
/*给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径，这条路径上所有节点值相加等于目标和 targetSum 。如果存在，返回 true ；否则，返回 false 。

叶子节点 是指没有子节点的节点。*/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
    bool floag = false;

public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if (root == nullptr)
            return false;
        dfs(root, targetSum, 0);
        return floag;
    }
    void dfs(TreeNode* root, int targetSum, int count) {
        // if (root == nullptr) {
        //   if (count == targetSum)
        //     floag = true;
        // return;
        //}
        if (root == nullptr)
            return;
        if (root->left == nullptr && root->right == nullptr) {
            count += root->val;
            if (count == targetSum)
                floag = true;
            return;
        }
        dfs(root->left, targetSum, count + root->val);
        dfs(root->right, targetSum, count + root->val);
    }
};


//逆波兰表达式求值
/*给你一个字符串数组 tokens ，表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数.
*/
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        vector<int> nums;
        for (auto& s : tokens) {
            if (s.size() == 1 &&
                (s[0] == '+' || s[0] == '*' || s[0] == '-' || s[0] == '/')) {
                int y = nums.back();
                nums.pop_back();
                int x = nums.back();
                nums.pop_back();
                // for (auto& num : nums) {
                //   cout << num << " ";
                //}
                //  cout << x / y << " ";
                switch (s[0]) {
                case '+':
                    nums.emplace_back(x + y);
                    break;
                case '-':
                    nums.emplace_back(x - y);
                    break;
                case '*':
                    nums.emplace_back(x * y);
                    break;
                case '/':
                    nums.emplace_back(x / y);
                    break;
                }
            } else {
                nums.emplace_back(atoi(s.c_str()));
            }
        }
        return nums.back();
    }
};